VSCodeとDockerで作ったGolangの開発環境にLocalStackを追加して、AWSのテスト環境を整える
こんにちは、CX事業本部の夏目です。
先日、VSCodeのExtension Remote-Containers
を使ってGolangの開発環境をDocker上に作りました。(リンク)
個人的な話ですが、AWSで使用するCLIツールをGolangで書いています。
そのため、AWS環境のMockとしてLocalStackを使い、テストを書きたいと思いました。
Remote-Containers
ではdocker-composeを使って環境を作ることができるので、今回はLocalStackもGolangの開発用Containerと同時に立ち上げるようにしていきたいと思います。
環境構築
事前準備
Golangの環境は前回のブログで作ったものを流用したいと思います。
(compose_test
というディレクトリで作業をVSCodeで開いて作業します)
compose_test/ └── .devcontainer/ ├── devcontainer.json └── Dockerfile
Remote-Containersのdocker-compose 設定
.devcontainer/devcontainer.json
に次のように書き換えます。
{ "name": "Go", "dockerComposeFile": [ "../docker-compose.yml", "compose.yml" ], "service": "compose_test", "workspaceFolder": "/workspace/compose_test", "shutdownAction": "stopCompose", "extensions": [ "ms-vscode.go" ], "settings": { "go.gopath": "/go" } }
dockerFile
の項目を削除して、docker-composeの設定を追加します。
dockerComposeFile
でdocker-composeの定義を書いたyamlファイルで定義します。
docker-composeの定義は複数ファイルに分けて記載することができます。
なので、LocalStackの設定を書いた docker-compose.yml
と開発用のコンテナの設定を書いたcompose.yml
に分けます。
service
は開発用のコンテナを指定します。
わかりやすく言うと、前回のブログで作成した、Golangを動かすためのコンテナです。
shutdownAction
は終了時のコンテナに対する操作を定義しています。
今回はdocker-composeで動かしているので、docker-composeをストップさせるようにしています。
LocalStack用のdocker-compose.yml
version: "3.3" services: localstack: container_name: localstack image: localstack/localstack:0.8.10 ports: - "4583:4583" environment: - SERVICES=ssm - DEFAULT_REGION=ap-northeast-1
基本的(?)なLocalStackの設定です。
とりあえず、動作確認するためにSSMのみ有効化してますが、必要に応じて他のサービスを有効化してください。
Golangを動かすコンテナを定義するcompose.yml
version: '3.3' services: compose_test: image: local/golang1 build: context: . dockerfile: .devcontainer/Dockerfile volumes: # Mounts the project folder to '/workspace'. The target path inside the container # should match what your application expects. In this case, the compose file is # in a sub-folder, so we will mount '..'. We'll then reference this as the # workspaceFolder in '.devcontainer/devcontainer.json' so VS Code starts here. - ../compose_test:/workspace/compose_test # [Optional] If you are using SSH keys w/Git, mount your .ssh folder to # /root/.ssh-localhost so we can copy its contents - ~/.ssh:/root/.ssh:ro # [Optional] Required for ptrace-based debuggers like C++, Go, and Rust cap_add: - SYS_PTRACE security_opt: - seccomp:unconfined # Overrides default command so things don't shut down after the process ends. command: /bin/sh -c "while sleep 1000; do :; done"
Remote-Containersのドキュメントに記載されていたサンプルをベースに作成しました。
build
オプションで、前回指定していた、Dockerfileを指定します。
(これで、前回使ったコンテナと同等のものを使用できます)
volumes
オプションで、ローカルのファイルをコンテナにマウントさせます。
また、~/.ssh
をマウントさせることでコンテナ内のbashで、Gitの操作をやりやすくしています。
準備完了
これでLocalStackを同時に立ち上げる準備は完了です。
ファイル構成は次のようになっています。
あとは Reopon Folder in Container
を行えばdocker-composeでコンテナが起動します。
compose_test/ ├── .devcontainer/ │ ├── compose.yml │ ├── devcontainer.json │ └── Dockerfile └── docker-compose.yml
動作確認
次のファイルを作成します。
package main import ( "github.com/aws/aws-sdk-go/aws" "github.com/aws/aws-sdk-go/aws/credentials" "github.com/aws/aws-sdk-go/aws/session" "github.com/aws/aws-sdk-go/service/ssm" "fmt" ) func main() { sess := session.Must(session.NewSession(&aws.Config{ Credentials: credentials.NewStaticCredentials("foo", "var", ""), Region: aws.String("ap-northeast-1"), Endpoint: aws.String("http://localstack:4583"), })) service := ssm.New(sess) putResult, _ := service.PutParameter(&ssm.PutParameterInput{ Name: aws.String("TestPath"), Value: aws.String("test"), Type: aws.String("String"), }) fmt.Println(putResult) describeResult, _ := service.DescribeParameters(&ssm.DescribeParametersInput{}) fmt.Println(describeResult) }
SSM ParameterをPutして、一覧表示させるためのものです。
$ go mod init main $ go run main.go
上記コマンドを実行すると、以下のようになります。
使用することができました。
これでLocalStackを使ったテストができます。
まとめ
コンテナを使った開発環境にLocalStackを追加して、AWSのテストができるようになりました。
Golang以外でも使用することできるので、使っていけたらなぁと思います。